package main

import (
	"fmt"
)

// 往管道里写数据的函数
func senddata(ch chan int, exitChan chan struct{}) {
	// 往数据管道里写数据，写完后关闭管道
	for i := 0; i < 10; i++ {
		ch <- i
	}
	close(ch)

	// 往数据管道里写完数据后往退出管道里写入退出新号
	var a struct{}
	exitChan <- a
}

// 从管道里读数据的函数
func getdata(ch chan int, exitChan chan struct{}) {
	// 死循环读取管道里的数据
	for {
		// 使用死循环读取管道里的数据时一定要通过类型断言判断管道关闭
		v, ok := <-ch
		if !ok {
			fmt.Println("form chan get data failed")
			break
		}
		fmt.Println(v)
	}
	// 读取完数据后往退出管道里写入退出新号
	var a struct{}
	exitChan <- a
}

func main() {
	// 初始化并实例化数据管道与结束信号管道
	var pipe chan int
	pipe = make(chan int, 10)
	exitChan := make(chan struct{}, 3)

	// 启动一个往管道里写数据的子线程
	go senddata(pipe, exitChan)
	// 启动一个从管道里读数据的子线程
	go getdata(pipe, exitChan)

	// 判断两个子线程是否结束
	var total = 0
	for range exitChan {
		total++
		if total == 2 { // 如果exitChan里有两个数则表示两个子线程结束了
			break
		}
	}

}
